技术 | 聊一聊 InnoDB 引擎中的索引类型
点击上方“平头哥的技术博文”,选择“关注公众号”
技术文章第一时间送达!
索引对数据库有多重要,我想大家都已经知道了吧,关于索引可能大家会对它多少有一些误解,首先索引是一种数据结构,并且索引不是越多越好。合理的索引可以提高存储引擎对数据的查询效率。
形象一点来说呢,索引跟书本的目录一样,能否快速的查找到你需要的信息,取决于你设计的目录是否合理。
MySQL 数据库有很多种索引,每种存储引擎的索引都不太一样,这篇文章就介绍一下 InnoDB 引擎中的索引,在 InnoDB 引擎中有三种索引:
B-Tree 索引 哈希索引 全文索引
B-Tree 索引
B-Tree 索引是 InnoDB 引擎的默认索引,如果我们没有特别指定索引,那么说的就是 B-Tree 索引。在 InnoDB 引擎中使用 B+树来实现 B-Tree 索引,关于 B+树的知识就百度吧,我也讲不清楚。
在 B-Tree 索引中又有主键索引和普通索引之分,分别来了解一下:
1、主键索引
主键索引也叫聚集索引,是按照主键构建的一棵 B+树,只要建立了主键就会自动加上索引,主键索引的特点是:叶子节点上存放着整张表的行记录数据,所以叶子节点也叫数据页。
正是因为这个特点,对于主键的排序查找和范围查找速度非常快,因为索引上就有用户需要查询的数据,所以不会要回表查询,这样就加快了查询速度,关于什么是回表,普通索引的时候再聊一聊。
2、普通索引
普通索引也叫二级索引,跟主键索引的主要区别在于叶子结点没有存放行记录的全部数据,只包含了需要的键值,还有一个标签,用来告诉存储引擎在哪里可以找到这行数据。
举个例子,让我们刚好的理解普通索引,如下面这张表:
mysql> create table T(
id int primary key,
k int not null,
name varchar(16),
index (k)) engine=InnoDB;
K 索引就是普通索引,除了主键之外的索引都是普通索引。
普通索引因为行记录里没有数据的全部信息,在使用普通索引查询时,需要现在普通索引树上搜索一遍,再回到主键索引树上查询到需要的信息,这个过程也叫回表。
可能回表不太好理解,我引用极客时间《MySQL实战45讲》里面的例子,先看下面这张图:
左边的是主键索引树,右边的是 K 索引树,假设我们现在要执行select * from T where k=5
语句,即普通索引查询方式,则需要先搜索 k 索引树,得到 K=5 对应的 ID 值为 500,再到 ID 索引树搜索一次,这个过程称为回表。
哈希索引
哈希索引在 InnoDB 引擎中叫作自适应哈希索引,它是由数据库自身根据你的使用情况创建的,并不能认为的干预,所以叫作自适应哈希索引,采用的是哈希表数据结构,所以对于字典类型查询就非常的快,但是对于范围查询就无能为力啦。
全文索引
在 B-Tree索引中,当我们执行 select * from blog where content like %xxxx%
语句时,索引会失效。全文索引可以有效的解决这种语句查询。
全文索引是一种比较特殊的索引,一般都是基于倒排索引来实现的,es 也是使用倒排索引。倒排索引跟 B-Tree 索引一样也是一种数据结构,在辅助表中存储了单词与单词自身在一个或多个文档中所在位置的映射。
现在有很多专门做全文索引的软件,例如 solr、elasticsearch等,MySQL 中的全文索引实现原理跟这些差不多。
以上就是关于 InnoDB 引擎中的索引类型,感谢您的阅读,希望这篇文章对您的学习或者工作有所帮助。
往日精选文章MySQL 持久化保障机制-redo 日志
为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?
你可能知道事务的四大特性,但是你不一定知道事务的实现原理
select * from user 这条 SQL 语句,背后藏着哪些不可告人的秘密?